package homework;
import java.util.Scanner;
import java.util.InputMismatchException;

public class 实验5 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (true) {
            try {
                System.out.print("请输入三条边（用空格分隔）：");
                // 使用统一方法读取三条边
                int side1 = readInt(sc, "请输入第一条边：");
                int side2 = readInt(sc, "请输入第二条边：");
                int side3 = readInt(sc, "请输入第三条边：");

                //分两类异常进行捕获，分别对应重新创建和错误退出
                // 异常捕获前面的不可以比这个后面的范围大，否则会导致兼容问题
                //即便我这样写依旧会导致问题，最好两个异常是并列关系，避免父子关系
                try {
                    Asj triangle = Asj.create_SJ(side1, side2, side3);
                    System.out.println("创建成功,这是第"+Asj.getCount()+"个三角形");
                } catch (IllegalArgumentException e) {
                    System.out.println(e.getMessage());
                    continue;
                } catch (IllegalStateException e) {
                    System.out.println(e.getMessage());
                    break;
                }

                System.out.print("是否继续？输入yes继续，其他退出：");
                String str = sc.nextLine();
                if (!str.equals("yes")) {
                    break;
                }


                //大的异常处理，用来处理hasnextint异常
            } catch (InputMismatchException e) {
                System.out.println("输入格式错误，请重新输入");
                sc.nextLine();
            }
        }
        sc.close();
    }
    //统一方法
    private static int readInt(Scanner sc,String prompt) {
        while (true) {
            System.out.print(prompt);
            if (!sc.hasNextInt()) {
                System.out.println("输入的不是整数，请重新输入");
                sc.nextLine();
                continue;
            }
            int value = sc.nextInt();
            sc.nextLine(); // 清除多余输入
            return value;
        }
    }
}

class Asj {
    private static final int MAX = 2;
    private static int count = 0;

    private int side1;
    private int side2;
    private int side3;

    // 私有构造方法，强制通过工厂方法创建
    private Asj(int side1, int side2, int side3) {
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }


    public static Asj create_SJ(int side1, int side2, int side3) {
        if (count >= MAX) {
            throw new IllegalStateException("次数已达上限，已退出");
        }

        // 验证三角形条件
        if (side1 <= 0 || side2 <= 0 || side3 <= 0) {
            throw new IllegalArgumentException("输入的边长为负数，重新输入");
        }
        if (!((side1 + side2 > side3) && (side1 + side3 > side2) && (side2 + side3 > side1))) {
            throw new IllegalArgumentException("输入的边长不满足三边关系");
        }

        count++;
        return new Asj(side1, side2, side3);//匿名创建
    }

    // 获取当前实例数量
    public static int getCount() {
        return count;
    }
}

